

/*
#### 现有如下数据需要处理：

  字段：用户ID，位置ID，开始时间，停留时长（分钟）

#### 4行样例数据：

   UserA,LocationA,8,60
   UserA,LocationA,9,60
   UserB,LocationB,10,60
   UserB,LocationB,11,80
   样例数据中的数据含义是：用户UserA，在LocationA位置，从8点开始，停留了60钟

####  处理要求：

  1、对同一个用户，在同一个位置，连续的多条记录进行合并

   2、合并原则：开始时间取最早时间，停留时长累计求和
 */

case class UserInfo(username: String, location: String, startTime: Int, duration: Int)
object Test {
  def main(args: Array[String]): Unit = {
    // 将数据封装到样例类中，初始化数据到集合
    val userInfoLst: List[UserInfo] = List(
      UserInfo("userA", "locationA", 8, 60),
      UserInfo("userA", "locationA", 9, 60),
      UserInfo("userB", "locationB", 11, 80),
      UserInfo("userB", "locationB", 10, 60)
    )
    // 分组
    val groupUserInfo: Map[String, List[UserInfo]] = userInfoLst.groupBy(user => user.username + "-" + user.location)
    println(groupUserInfo)
    // 排序
    val sortUserInfo: Map[String, List[UserInfo]] = groupUserInfo.mapValues(_.sortBy(_.startTime))
    println(sortUserInfo)
    // 统计

    val sumUserInfo: Map[String, Tuple4[String,String,Int,Int]] = sortUserInfo.mapValues(lst => {
        (   lst.head.username,
          lst.head.location,
          lst.head.startTime,
            lst.map(_.duration).sum)
    })
    println(sumUserInfo)
    // 输出
    sumUserInfo.foreach{
      case (k, v) => println(s" $v")
    }
  }
}
